From b4c814e272906927e8cdcb985874dc93dae3fc42 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Tue, 21 Jul 1998 19:31:38 +0000 Subject: [PATCH] We free things from the text property MemChunk, so it needs to be Wed Jul 15 17:44:47 1998 Owen Taylor * gtk/gtktext.c (new_text_property): We free things from the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. * Fix up line start cache when splitting a property during an insert. --- ChangeLog | 8 +++++++ ChangeLog.pre-2-0 | 8 +++++++ ChangeLog.pre-2-10 | 8 +++++++ ChangeLog.pre-2-2 | 8 +++++++ ChangeLog.pre-2-4 | 8 +++++++ ChangeLog.pre-2-6 | 8 +++++++ ChangeLog.pre-2-8 | 8 +++++++ gtk/gtktext.c | 55 ++++++++++++++++++++++++++++++++++++++++------ 8 files changed, 104 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index fdcb3d9b7e..25ff25730f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed Jul 15 17:44:47 1998 Owen Taylor + + * gtk/gtktext.c (new_text_property): We free things from + the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. + + * Fix up line start cache when splitting a property + during an insert. + 1998-07-20 Raph Levien * gdk/gdkrgb.c: More cleanups in the config process. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index fdcb3d9b7e..25ff25730f 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,11 @@ +Wed Jul 15 17:44:47 1998 Owen Taylor + + * gtk/gtktext.c (new_text_property): We free things from + the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. + + * Fix up line start cache when splitting a property + during an insert. + 1998-07-20 Raph Levien * gdk/gdkrgb.c: More cleanups in the config process. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index fdcb3d9b7e..25ff25730f 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +Wed Jul 15 17:44:47 1998 Owen Taylor + + * gtk/gtktext.c (new_text_property): We free things from + the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. + + * Fix up line start cache when splitting a property + during an insert. + 1998-07-20 Raph Levien * gdk/gdkrgb.c: More cleanups in the config process. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index fdcb3d9b7e..25ff25730f 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,11 @@ +Wed Jul 15 17:44:47 1998 Owen Taylor + + * gtk/gtktext.c (new_text_property): We free things from + the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. + + * Fix up line start cache when splitting a property + during an insert. + 1998-07-20 Raph Levien * gdk/gdkrgb.c: More cleanups in the config process. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index fdcb3d9b7e..25ff25730f 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,11 @@ +Wed Jul 15 17:44:47 1998 Owen Taylor + + * gtk/gtktext.c (new_text_property): We free things from + the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. + + * Fix up line start cache when splitting a property + during an insert. + 1998-07-20 Raph Levien * gdk/gdkrgb.c: More cleanups in the config process. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index fdcb3d9b7e..25ff25730f 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,11 @@ +Wed Jul 15 17:44:47 1998 Owen Taylor + + * gtk/gtktext.c (new_text_property): We free things from + the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. + + * Fix up line start cache when splitting a property + during an insert. + 1998-07-20 Raph Levien * gdk/gdkrgb.c: More cleanups in the config process. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index fdcb3d9b7e..25ff25730f 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +Wed Jul 15 17:44:47 1998 Owen Taylor + + * gtk/gtktext.c (new_text_property): We free things from + the text property MemChunk, so it needs to be G_ALLOC_AND_FREE. + + * Fix up line start cache when splitting a property + during an insert. + 1998-07-20 Raph Levien * gdk/gdkrgb.c: More cleanups in the config process. diff --git a/gtk/gtktext.c b/gtk/gtktext.c index f15d62f23a..68bbdcb100 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -2457,12 +2457,31 @@ delete_expose (GtkText* text, guint nchars, guint old_lines, guint old_pixels) static void correct_cache_insert (GtkText* text, gint nchars) { - GList* cache = text->current_line->next; + GList *cache; + GtkPropertyMark *start; + GtkPropertyMark *end; + + /* If we split a property exactly at the beginning of the + * line, we have to correct here, or fetch_lines will + * fetch junk. + */ + + start = &CACHE_DATA(text->current_line).start; + if (start->offset == MARK_CURRENT_PROPERTY (start)->length) + SET_PROPERTY_MARK (start, start->property->next, 0); + + /* Now correct the offsets, and check for start or end marks that + * are after the point, yet point to a property before the point's + * property. This indicates that they are meant to point to the + * second half of a property we split in insert_text_property(), so + * we fix them up that way. + */ + cache = text->current_line->next; for (; cache; cache = cache->next) { - GtkPropertyMark *start = &CACHE_DATA(cache).start; - GtkPropertyMark *end = &CACHE_DATA(cache).end; + start = &CACHE_DATA(cache).start; + end = &CACHE_DATA(cache).end; if (LAST_INDEX (text, text->point) && start->index == text->point.index) @@ -2472,7 +2491,16 @@ correct_cache_insert (GtkText* text, gint nchars) if (start->property == text->point.property) move_mark_n(start, nchars); else - start->index += nchars; + { + if (start->property->next && + (start->property->next->next == text->point.property)) + { + g_assert (start->offset >= MARK_CURRENT_PROPERTY (start)->length); + start->offset -= MARK_CURRENT_PROPERTY (start)->length; + start->property = text->point.property; + } + start->index += nchars; + } } if (LAST_INDEX (text, text->point) && @@ -2482,8 +2510,17 @@ correct_cache_insert (GtkText* text, gint nchars) { if (end->property == text->point.property) move_mark_n(end, nchars); - else - end->index += nchars; + else + { + if (end->property->next && + (end->property->next->next == text->point.property)) + { + g_assert (end->offset >= MARK_CURRENT_PROPERTY (end)->length); + end->offset -= MARK_CURRENT_PROPERTY (end)->length; + end->property = text->point.property; + } + end->index += nchars; + } } /*TEXT_ASSERT_MARK(text, start, "start");*/ @@ -2635,7 +2672,7 @@ new_text_property (GdkFont* font, GdkColor* fore, GdkColor* back, guint length) text_property_chunk = g_mem_chunk_new ("text property mem chunk", sizeof(TextProperty), 1024*sizeof(TextProperty), - G_ALLOC_ONLY); + G_ALLOC_AND_FREE); } prop = g_chunk_new(TextProperty, text_property_chunk); @@ -2768,6 +2805,10 @@ insert_text_property (GtkText* text, GdkFont* font, } else { + /* The following will screw up the line_start cache, + * we'll fix it up in correct_cache_insert + */ + /* In the middle of forward_prop, if properties are equal, * just add to its length, else split it into two and splice * in a new one. */ -- 2.30.2